<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>面向对象设计原则 | 大涛的个人博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="面向对象设计原则依赖倒置原则(DIP) 高层模块不应该依赖低层模块，二者都应该依赖于抽象(稳定)； 抽象不应该依赖于实现细节（变化），实现细节应该依赖于抽象。  开放封闭原则(OCP) 对扩展开放，对修改封闭 类模块是可扩展的，但是不可修改。  单一职责原则(SRP) 一个类应该仅有一个引起他变化的原因。 变化的方向隐含着类的责任  里氏代换原则(LSP) 子类必须能够替换他们的基类（父类） 继承">
<meta property="og:type" content="article">
<meta property="og:title" content="面向对象设计原则">
<meta property="og:url" content="http://bailefolen.gitee.io/my-blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/index.html">
<meta property="og:site_name" content="大涛的个人博客">
<meta property="og:description" content="面向对象设计原则依赖倒置原则(DIP) 高层模块不应该依赖低层模块，二者都应该依赖于抽象(稳定)； 抽象不应该依赖于实现细节（变化），实现细节应该依赖于抽象。  开放封闭原则(OCP) 对扩展开放，对修改封闭 类模块是可扩展的，但是不可修改。  单一职责原则(SRP) 一个类应该仅有一个引起他变化的原因。 变化的方向隐含着类的责任  里氏代换原则(LSP) 子类必须能够替换他们的基类（父类） 继承">
<meta property="og:locale">
<meta property="article:published_time" content="2020-08-26T08:47:36.894Z">
<meta property="article:modified_time" content="2020-08-26T10:23:29.300Z">
<meta property="article:author" content="Datao">
<meta property="article:tag" content="Java后端开发er">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/my-blog/atom.xml" title="大涛的个人博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/my-blog/css/style.css">

<meta name="generator" content="Hexo 5.1.1"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/my-blog/" id="logo">大涛的个人博客</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/my-blog/">Home</a>
        
          <a class="main-nav-link" href="/my-blog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/my-blog/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://bailefolen.gitee.io/my-blog"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-设计模式原则" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/my-blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/" class="article-date">
  <time datetime="2020-08-26T08:47:36.894Z" itemprop="datePublished">2020-08-26</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      面向对象设计原则
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="面向对象设计原则"><a href="#面向对象设计原则" class="headerlink" title="面向对象设计原则"></a>面向对象设计原则</h2><h3 id="依赖倒置原则-DIP"><a href="#依赖倒置原则-DIP" class="headerlink" title="依赖倒置原则(DIP)"></a>依赖倒置原则(DIP)</h3><ul>
<li>高层模块不应该依赖低层模块，二者都应该依赖于抽象(稳定)；</li>
<li>抽象不应该依赖于实现细节（变化），实现细节应该依赖于抽象。</li>
</ul>
<h3 id="开放封闭原则-OCP"><a href="#开放封闭原则-OCP" class="headerlink" title="开放封闭原则(OCP)"></a>开放封闭原则(OCP)</h3><ul>
<li>对扩展开放，对修改封闭</li>
<li>类模块是可扩展的，但是不可修改。</li>
</ul>
<h3 id="单一职责原则-SRP"><a href="#单一职责原则-SRP" class="headerlink" title="单一职责原则(SRP)"></a>单一职责原则(SRP)</h3><ul>
<li>一个类应该仅有一个引起他变化的原因。</li>
<li>变化的方向隐含着类的责任</li>
</ul>
<h3 id="里氏代换原则-LSP"><a href="#里氏代换原则-LSP" class="headerlink" title="里氏代换原则(LSP)"></a>里氏代换原则(LSP)</h3><ul>
<li>子类必须能够替换他们的基类（父类）</li>
<li>继承表达类型的抽象</li>
</ul>
<h3 id="接口隔离原则-ISP"><a href="#接口隔离原则-ISP" class="headerlink" title="接口隔离原则(ISP)"></a>接口隔离原则(ISP)</h3><ul>
<li>不应该改强迫客户程序依赖他们不用的方法。</li>
<li>接口应该小且完备。</li>
</ul>
<h3 id="优先使用组合而不是继承"><a href="#优先使用组合而不是继承" class="headerlink" title="优先使用组合而不是继承"></a>优先使用组合而不是继承</h3><ul>
<li>类继承通常是“白箱复用”，对象组合通常是黑箱复用。</li>
<li>继承在某种程度上破坏了封装性，子类与父类耦合度过高。</li>
<li>对象组合只要求被组合的对象具有定义好的接口。</li>
</ul>
<h3 id="封装变化点"><a href="#封装变化点" class="headerlink" title="封装变化点"></a>封装变化点</h3><p>使用封装来创建对象之间的分界层，让设计者在分阶层一侧修改，另一侧不会产生不良影响，从而实现松耦合。</p>
<h3 id="针对接口编程而不是实现编程"><a href="#针对接口编程而不是实现编程" class="headerlink" title="针对接口编程而不是实现编程"></a>针对接口编程而不是实现编程</h3><ul>
<li>不讲变量类型声明成具体实现类而是声明为接口。</li>
<li>客户程序无需获取对象的具体类型，只需要知道对象所属的接口。</li>
<li>减少系统中各个部分的依赖关系，从而实现高内聚，低耦合的设计方案。</li>
</ul>
<h2 id="从封装变化角度对模式进行分类"><a href="#从封装变化角度对模式进行分类" class="headerlink" title="从封装变化角度对模式进行分类"></a>从封装变化角度对模式进行分类</h2><p>组件协作：Template Method,Strategy,Observer/Event</p>
<p>对象性能：Singleton，Flyweight</p>
<p>单一职责：Decorator，Bridge</p>
<p>对象创建：Factory Method，Abstract Factory，Prototype，Builder</p>
<p>接口隔离：Facade，Proxy，Mediator，Adapter    </p>
<p>状态变化：State ，Memento</p>
<p>行为变化：Command,Visitor</p>
<p>数据结构：composite，Iterator，Chain of Resposibility</p>
<p>领域问题：Interpreter</p>
<h2 id="重构关键技法"><a href="#重构关键技法" class="headerlink" title="重构关键技法"></a>重构关键技法</h2><ol>
<li>静态绑定到动态绑定</li>
<li>早绑定到晚绑定</li>
<li>继承优化成组合</li>
<li>编译时依赖到运行时依赖</li>
<li>紧耦合道松耦合</li>
</ol>
<h2 id="模板方法设计模式"><a href="#模板方法设计模式" class="headerlink" title="模板方法设计模式"></a>模板方法设计模式</h2><p>定义一个操作中的算法的骨架（稳定），而将一些步骤延迟到子类中。模板方法使得子类可以复用父类的方法（重写），重新定义特定的步骤。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://bailefolen.gitee.io/my-blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/" data-id="ckeb79hvp0001zw4of4ogbso0" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
  
    <a href="/my-blog/2020/08/26/hello-world/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">Hello World</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/my-blog/archives/2020/08/">August 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/my-blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/">面向对象设计原则</a>
          </li>
        
          <li>
            <a href="/my-blog/2020/08/26/hello-world/">Hello World</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2020 Datao<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/my-blog/" class="mobile-nav-link">Home</a>
  
    <a href="/my-blog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/my-blog/fancybox/jquery.fancybox.css">

  
<script src="/my-blog/fancybox/jquery.fancybox.pack.js"></script>




<script src="/my-blog/js/script.js"></script>




  </div>
</body>
</html>